package fr.dauphine.td3.bdd;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import fr.dauphine.td3.emp.Utilisateur;

@Repository
@Transactional
public class UtilisateurDAO {
	
	private SessionFactory sessionFactory;
	
	public Session getSession() {
		return this.sessionFactory.getCurrentSession();
	}
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	@Transactional(readOnly = true)
	public List<Utilisateur> get() {
		return (List<Utilisateur>) getSession().createQuery("from Utilisateur").list();
	}
	
	@Transactional(readOnly = true)
	public Utilisateur get(String id) {
		Utilisateur utilisateur = (Utilisateur) getSession().load(Utilisateur.class, id);
		
		return utilisateur;
	}
	
	@Transactional(readOnly = true)
	public Utilisateur getL(String login) {
		Utilisateur utilisateur = (Utilisateur) getSession().load(Utilisateur.class, login);
		
		return utilisateur;
	}
	
	@Transactional(readOnly = false)
	public void activerCompte(Utilisateur u) {
		u.setValide(1);
		getSession().saveOrUpdate(u);
	}
	
	@Transactional(readOnly = false)
	public void activerDroitAdmin(Utilisateur u) {
		u.setAdministrateur(1);
		getSession().saveOrUpdate(u);
	}
	
	@Transactional(readOnly = false)
	public void desactiverAllDroitAdmin() {
		List<Utilisateur> lu = new ArrayList<Utilisateur>();
		
		lu = get();
		
		Iterator<Utilisateur> it = lu.iterator();
		Utilisateur u;
		
		while(it.hasNext()){
			u = it.next();
			
			if (u.getValide() == 1) {
				u.setAdministrateur(0);
				getSession().saveOrUpdate(u);
			}
			
		}
	}
	
	@Transactional(readOnly=false, propagation = Propagation.REQUIRED)
	public void save(Utilisateur utilisateur) {
		//utilisateur.setPassword(DigestUtils.md5Hex(utilisateur.getPassword()));
		utilisateur.setValide(1);
		getSession().saveOrUpdate(utilisateur);
	}

	@Transactional(readOnly=false, propagation = Propagation.REQUIRED)
	public void delete(Utilisateur utilisateur) {
		getSession().delete(utilisateur);
	}
}
